<?php
/**
+------------------------------------+
| 2010-2016 (c)                      |
+------------------------------------+
| Author: amamatthew                 |
+------------------------------------+
 * 日    期：2017-08-05
 * 版    本：1.0.0
 * 功能说明：日期时间工具类。
 * 参    考: https://yq.aliyun.com/articles/42800
 **/
namespace app\ux;

class DateTime
{

    /**
     * 默认时区
     */
    public static function timezone()
    {
        return date_default_timezone_get();
    }
    /**
     * 设置时区
     */
    public static function setTimezone($zone = "PRC")
    {
        return date_default_timezone_set($zone);
    }
    /**
     * 获得时间戳
     *
     * @param int $dateTime 默认为空，则以当前时间戳返回, 为数字的时候直接返回
     * @return int
     */
    public static function getTimeStamp($dateTime = null)
    {
        return $dateTime ? is_numeric($dateTime) ? $dateTime : strtotime($dateTime) : time();
    }

    /**
     * 格式化输出
     *
     * @param string $format 目标格式，默认为空则以Y-m-d H:i:s格式输出
     * @param int $dateTime Unix时间戳,默认为空则获取当前时间戳
     * @return string
     */
    public static function format($format = null, $dateTime = null)
    {
        return date($format ? $format : 'Y-m-d H:i:s', self::getTimeStamp($dateTime));
    }
    /**
     * 获取月份的第一天
     *
     * @param int $month 月份
     * @param int $year  年份
     * @param int $format 返回的日期格式
     * @return string 返回的日期
     */
    public static function firstDayOfMonth($month = null, $year = null, $format = 'Y-m-d')
    {
        $year  = $year ? $year : self::format('Y');
        $month = $month ? $month : self::format('m');
        return self::format($format, mktime(0, 0, 0, $month, 1, $year));
    }
    /**
     * 获取月份最后一天
     *
     * @param int $month 月份
     * @param int $year  年份
     * @param int $format 返回的日期格式
     * @return string 返回的日期
     */
    public static function lastDayOfMonth($month = null, $year = null, $format = 'Y-m-d')
    {
        $year  = $year ? $year : self::format('Y');
        $month = $month ? $month : self::format('m');
        return self::format($format, mktime(0, 0, 0, $month + 1, 0, $year));
    }
    /**
     * 获取年份的第一天
     *
     * @param int $year 年份
     * @param int $format 返回的日期格式
     * @return string 返回的日期
     */
    public static function firstDayOfYear($year = null, $format = 'Y-m-d')
    {
        $year = $year ? $year : self::format('Y');
        return self::format($format, mktime(0, 0, 0, 1, 1, $year));
    }
    /**
     * 获取年份最后一天
     *
     * @param int $year   年份
     * @param int $format 返回的日期格式
     * @return string 返回的日期
     */
    public static function lastDayOfYear($year = null, $format = 'Y-m-d')
    {
        $year = $year ? $year : self::format('Y');
        return self::format($format, mktime(0, 0, 0, 1, 0, $year + 1));
    }
    /**
     * 距离当前时间日期数字转中文，适用于两天以内
     * @param int $dateline 时间戳
     * @return string 友好时间表示
     */
    public static function timeFromNow($dateline)
    {
        if (empty($dateline)) {
            return false;
        }

        $seconds = time() - $dateline;
        if ($seconds >= 0) {
            if ($seconds < 60) {
                return "1分钟前";
            } elseif ($seconds < 3600) {
                return floor($seconds / 60) . "分钟前";
            } elseif ($seconds < 24 * 3600) {
                return floor($seconds / 3600) . "小时前";
            } elseif ($seconds < 48 * 3600) {
                return date("昨天 H:i", $dateline) . "";
            } else {
                return date('Y-m-d', $dateline);
            }
        } else {
            //取绝对值
            $seconds = -$seconds;

            if ($seconds <= 60) {
                return "1分钟以内";
            } elseif ($seconds < 3600) {
                return floor($seconds / 60) . "分钟之后";
            } elseif ($seconds < 24 * 3600) {
                return floor($seconds / 3600) . "小时之后";
            } elseif ($seconds < 48 * 3600) {
                return date("明天 H:i", $dateline) . "";
            } else {
                return date('Y-m-d', $dateline);
            }
        }
    }
    /**
     * 获取星期
     *
     * @param int $week 星期，默认为当前时间获取
     * @return string
     */
    public static function getWeek($week = null)
    {
        $week    = $week ? $week : self::format('w');
        $weekArr = array('星期天', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六');
        return $weekArr[$week];
    }
    /**
     * 计算日期时间差
     *
     * @param string $start 起始时间
     * @param string $end   终止时间
     * @return array 天时分秒格式时间差数组
     */
    public static function timeDiff($start, $end)
    {

        if (self::checkDateTimeIsValid($start) && self::checkDateTimeIsValid($end)) {
            //时间戳
            $start = strtotime($start);
            $end   = strtotime($end);

            if ($start < $end) {
                $starttime = $start;
                $endtime   = $end;
            } else {
                $starttime = $end;
                $endtime   = $start;
            }
            //时间差
            $timediff = $endtime - $starttime;

            $r["date"]   = floor(($timediff) / 86400);
            $r["hour"]   = floor(($timediff) % 86400 / 3600);
            $r["minute"] = floor(($timediff) % 86400 % 3600 / 60);
            $r["second"] = floor(($timediff) % 86400 % 3600 % 60);
            return $r;
        } else {
            echo ('起止日期的字符串格式错误');
        }
    }
    /**
     * 校验日期时间的格式是否正确
     *
     * @param string $date 待检验日期
     * @param string $formats 需要检验格式的数组,可根据需要增加匹配格式
     * @return boolean
     */
    public static function checkDateTimeIsValid($datetime, $formats = array("Y-m-d", "Y-m-d H:i:s"))
    {
        $unixTime = strtotime($datetime);
        if (!$unixTime) {
            return false;
        }
        //校验日期的有效性，需要满足数组其中一种格式
        foreach ($formats as $format) {
            if (date($format, $unixTime) == $datetime) {
                return true;
            }
        }
        return false;
    }
    /**
     * 比较日期时间的日期部分
     *
     * @param    timestamp $time1 时间戳
     * @param    timestamp $time2 时间戳
     * @return   boolean 比较结果
     */
    public function compareDate($time1, $time2)
    {
        if (date("Y-m-d", $time1) === date("Y-m-d", $time2)) {
            return true;
        } else {
            return false;
        }
    }
}
